import csv
import json
import traceback
import jsonpath
import yaml

from common.logger_util import error_log
from common.yaml_util import get_object_path


# 读取测试用例的方法 第一步
def read_testcase_yaml(yaml_path):
    try:
        with open(get_object_path() + yaml_path, mode='r', encoding='utf-8-sig')as f:
            caseinfo = yaml.load(stream=f, Loader=yaml.FullLoader)
            if len(caseinfo) >= 2:
                return caseinfo
            else:
                if jsonpath.jsonpath(*caseinfo, '$.parameters'):

                    # 解析csv文后 替换的值
                    new_caseinfo = ananysis_parameters(*caseinfo)
                    print(new_caseinfo)
                    return new_caseinfo
                else:
                    # print("==============返回读取测试用例的参数==================")
                    # print(caseinfo)
                    # print(type(caseinfo))
                    return caseinfo
    except Exception as f:
        error_log("读取用例文件报错：异常信息：%s" % str(traceback.format_exc()))


# 第二部
def ananysis_parameters(caseinfo) -> list:
    try:
        caseinfo_keys = dict(caseinfo).keys()
        if 'parameters' in caseinfo_keys:
            for key, value in dict(caseinfo['parameters']).items():

                caseinfo_str = json.dumps(caseinfo)

                key_list = str(key).split('-')
                length_flag = True

                #读取csv文件没一行为一个列表
                csv_data_list = read_csv_file(value)
                #第一行为名字
                one_row_csv_data = csv_data_list[0]
                for csv_data in csv_data_list:
                    if len(csv_data) != len(one_row_csv_data):
                        length_flag = False
                        break

                # 先规范在解析,此注释值仅代表get_token.csvwen文件的值
                # 替换参数化后的值
                new_caseinfo = []
                if length_flag:
                    # 为啥从第一个开始：第一行为表头
                    for x in range(1, len(csv_data_list)):  # x代表行 1-2
                        temp_caseinfo = caseinfo_str
                        # csv_data_list ，每行存为一个列表
                        for y in range(0, len(csv_data_list[x])):  # y代表列，每行的值 此时读取get_token.yml文件数据 0-4
                            # 判断表头csv的表头是否在yaml的params中
                            if csv_data_list[0][y] in key_list:
                                # '$csv{" + csv_data_list[0][y] + "}'  替换  成csv_data_list[x][y]的值
                                '''
                                csv_data_list[0][0]   csv_data_list[1][0]
                                csv_data_list[0][1]   csv_data_list[1][1]
                                csv_data_list[0][2]   csv_data_list[1][2]
                                csv_data_list[0][3]   csv_data_list[1][3]
                                csv_data_list[0][4]   csv_data_list[1][5]
                                第二行数据的值替换成第一行的参数
                                '''
                                temp_caseinfo = temp_caseinfo.replace("$csv{" + csv_data_list[0][y] + "}",csv_data_list[x][y])
                        new_caseinfo.append(json.loads(temp_caseinfo))
                # print(new_caseinfo)
                return new_caseinfo
        else:
            return caseinfo
    except Exception as f:
        error_log("分析parameters异常：异常信息：%s" % str(traceback.format_exc()))


# 读取csv文件 度三步
def read_csv_file(csv_path) -> list:
    try:
        csv_data_list = []
        with open(get_object_path() + "/" + csv_path, encoding='utf-8-sig')as f:
            csv_data = csv.reader(f)
            for row in csv_data:
                csv_data_list.append(row)
        return csv_data_list
    except Exception as f:
        error_log("读取csv文件报错：异常信息：%s" % str(traceback.format_exc()))


#
if __name__ == '__main__':
    read_testcase_yaml('/testcase/yaml/get_token.yml')
